package com.ww.springboot.boot.classloader;

import java.io.IOException;
import java.io.InputStream;

/**
 * 描述：
 *
 * @author 🧑 ‍wanwei
 * @since 2023-02-01 14:19
 */

/**
 * 类加载器与instanceof关键字演示
 *
 * @author zzm
 */
public class ClassLoaderTest {

    public static void main(String[] args) throws Exception {

//        //破坏双亲委派--使用自定义的加载器即可
//        ClassLoader myLoader = new ClassLoader() {
//            @Override
//            public Class<?> loadClass(String name) throws ClassNotFoundException {
//                try {
//                    String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
//                    InputStream is = getClass().getResourceAsStream(fileName);
//                    System.out.println("super:" + super.toString());
//                    //找不到才使用父级类加载器加载 此处破坏了双亲委派
//                    if (is == null) {
//                        return super.loadClass(name);
//                    }
//                    byte[] b = new byte[is.available()];
//                    is.read(b);
//                    return defineClass(name, b, 0, b.length);
//                } catch (IOException e) {
//                    throw new ClassNotFoundException(name);
//                }
//            }
//
//            @Override
//            protected Class<?> findClass(String name) throws ClassNotFoundException {
//                return super.findClass(name);
//            }
//        };
//
//        Object obj = myLoader.loadClass("com.ww.springboot.boot.classloader.CLBean").newInstance();
//
//        System.out.println(obj.getClass());
//        System.out.println(obj instanceof com.ww.springboot.boot.classloader.CLBean);
//
//        CLBean clBean = new CLBean();
//        System.out.println(clBean.getClass());
//        System.out.println(obj.getClass());
//        System.out.println(clBean.getClass() == obj.getClass());
//        System.out.println("clBean类加载器:" + clBean.getClass().getClassLoader());
//        System.out.println("clBean类加载器父类:" + clBean.getClass().getClassLoader().getParent());
//        System.out.println("clBean类加载器父类父类:" + clBean.getClass().getClassLoader().getParent().getParent());
//        System.out.println("obj类加载器:" + obj.getClass().getClassLoader());
//        System.out.println("obj类加载器父类:" + obj.getClass().getClassLoader().getParent());
//        System.out.println("obj类加载器父类父类:" + obj.getClass().getClassLoader().getParent().getParent());
    }
}
